const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');

module.exports = {
  // context: path.join(__dirname), // 相对路径的参照，默认项目根目录
  entry: './src/index.js',
  output: {
    path: path.join(__dirname, '../dist'),
    /*
    * hash: 每次编译生成一个新的hash, 每个chunk都一样
    * chunkhash: 入口文件(及其依赖项)只要有一个发生变化，就会生成一个新的hash
    * contenthash: 单个文件内容发生变化，就会生成一个新的hash
    * */
    filename: '[name].[chunkhash:8].js',
    // publicPath: '/assets/' 给所有引用资源路径前加上 /assets/
    publicPath: ''
  },
  module: {
    // 忽略大型的 library 可以提高构建性能
    noParse: /jquery|lodash/,
    rules: [
      {
        test: /\.js$/,
        loader: 'eslint-loader',
        include: path.join(__dirname, 'src'),
        exclude: /node_modules/,
        // 相同test规则默认是从下往上执行，设置成pre就会优先
        enforce: 'pre'
      },
      {
        test: /\.js$/,
        use: ['babel-loader'],
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            // 内置了file-loader, 所以不需要file-loader了
            loader: 'url-loader',
            options: {
              outputPath: 'assets/images',
              publicPath: '/assets/images', // 图片访问前缀
              // name: '[path][name:8].[ext]',
              limit: 8 * 1024, // 如果小于8k, 就把这文件转成base64编码,
              // esModule: false
            }
          }
        ]
      },
      {
        test: /\.(ttf|svg|eot|woff|woff2|otf)$/,
        use: 'url-loader'
      },
      // {
      //   test: /\.(html|htm|ejs)$/,
      //   use: ['html-loader']
      // }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    
    // 在dist下生成一个html文件
    new HtmlWebpackPlugin({
      template: './src/index.html'
      // chunks: ['common', 'index'] // 指定引入那个js(chunk), 默认会把入口生成的chunk全引入到html里去
      // chunksSortMode: "manual" // 按chunks数组中的顺序引入
    }),
    new webpack.DefinePlugin({
      VERSION: JSON.stringify("5fa3b9"),
      BROWSER_SUPPORTS_HTML5: true,
      TWO: "1+1",
      "typeof window": JSON.stringify("object")
    }),
    new FriendlyErrorsPlugin()
  ],
  // stats: 'minimal'
}
